package org.example.base;

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.HashMap;
import java.util.Map;

//统一响应数据格式封装
@ControllerAdvice//这个注解作用就是对controller进行增强（原理也是springmvc代码设计的）
public class ResponseAdvice implements ResponseBodyAdvice {
    //这个方法的返回值，表示是否对请求映射方法增强
    //两个方法参数，可以筛选controller中的请求映射方法
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;//不筛选，全部增强
    }


    //增强的逻辑：http返回的响应，是基于本方法的返回值来设置响应体body
    //第一个方法参数body，是请求映射方法的返回值
    //比如调用登录接口，返回Map对象（ok=false,msg=xxx），就是这里的body方法参数
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        //构造一个统一返回的格式
        Map<String, Object> map = new HashMap<>();
        map.put("success", true);
        map.put("data", body);
        return map;
    }

}